package br.com.naestrada.controller;

import br.com.naestrada.dao.DaoGenerico;

import br.com.naestrada.entities.Foto;
import br.com.naestrada.entities.TipoVeiculo;
import br.com.naestrada.entities.Usuario;
import br.com.naestrada.entities.Veiculo;
import br.com.naestrada.util.FacesUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import org.apache.myfaces.trinidad.model.UploadedFile;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller("fotoController")
@Scope("session")
public class FotoController {

	private Foto foto;
        private TipoVeiculo tipoVeiculo;
        private Veiculo veiculo;
	private DataModel model;
        private Integer nota;
        private String coords;
        
        
		
	/*
	 * Recurso injetado pelo Spring
	 * 
	 */
 	@Resource
	private  DaoGenerico<Foto,Integer> fotoDao;
        
        @Resource
	private  DaoGenerico<Veiculo,Integer> veiculoDao;        
        
        @Resource
	private  DaoGenerico<Usuario,Integer> usuarioDao;    
        
	@Resource
	private DaoGenerico<TipoVeiculo, Integer> tipoVeiculoDao;

        
        private UploadedFile file;
        private String descricao;
        private Map<String, Object> tipoVeiculoItem = null;
        private Map<String, Object> veiculoItem = null;
        
	public FotoController(){
            foto = new Foto();
            tipoVeiculo = new TipoVeiculo();
            veiculo = new Veiculo();
        }
        
        public void fileUploaded(ValueChangeEvent event) {
            file = (UploadedFile) event.getNewValue();
            /*if (file != null) {
                FacesContext context = FacesContext.getCurrentInstance();
                FacesMessage message = new FacesMessage( "Successfully uploaded file " + file.getFilename() + " (" + file.getLength() + " bytes)");
                context.addMessage(event.getComponent().getClientId(context), message);                
            }*/
        }
        

	public String salvar() {
		            
                        FacesContext fc = FacesContext.getCurrentInstance();
                    	HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
                        
                        UploadedFile arquivo = getFile();
                        String user = (String) session.getAttribute("user");

			FacesContext context = FacesContext.getCurrentInstance();
			ServletContext sc = (ServletContext) context.getExternalContext().getContext();
                        

			if (foto.getId() == null) {
                            
                                foto.setCoords(coords);                                                     
                                foto.setIdUsuario(verificaU(user));                                
                                foto.setDescricao(descricao);
                                foto.setQuantidade(0);
                                foto.setNota(0);

				fotoDao.salvar(foto);
				FacesUtils.mensInfo("Cadastrado com sucesso");
			}  

		return "sucesso";

	}
         

	// salva o arquivo no disco
	public boolean salvarArquivo(byte[] buf, InputStream stream,
			String nomeArquivo, int size, String path)
			throws FileNotFoundException, IOException {

		nomeArquivo = this.separaNomeImagem(nomeArquivo);

		File file = new File(path + "/" + nomeArquivo);

		FileOutputStream output = new FileOutputStream(file);
		try {
			while (true) {
				int count = stream.read(buf, 0, size);
				if (count == -1)
					break;
				output.write(buf, 0, count);

			}
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}

		finally {
			output.flush();
			output.close();
			stream.close();
		}
		return true;

	}

	private Usuario verificaU(String email) {
		String query = "SELECT u FROM Usuario u WHERE u.email=:email";
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("email", email);
		return usuarioDao.pesqParam(query, params);

	}        
        
        
         
        
	public Map<String, Object> getTipoVeiculos() {

		tipoVeiculoItem = new LinkedHashMap<String, Object>();

		for (Iterator<?> iter = tipoVeiculoDao.todos().iterator(); iter.hasNext();) {
			TipoVeiculo c = (TipoVeiculo) iter.next();
			tipoVeiculoItem.put(c.getDescricao(), c);// label,value
		}
		return tipoVeiculoItem;
	}    
        
	public Map<String, Object> getVeiculos() {

		veiculoItem = new LinkedHashMap<String, Object>();

		for (Iterator<?> iter = veiculoDao.todos().iterator(); iter.hasNext();) {
			Veiculo c = (Veiculo) iter.next();
			veiculoItem.put(c.getDescricao(), c);// label,value
		}
		return veiculoItem;
	}          
        
	// separa o caminho físico do nome do arquivo
	private String separaNomeImagem(String nomeImagem) {

		if (nomeImagem.lastIndexOf("\\") >= -1) {
			nomeImagem = nomeImagem.substring(nomeImagem.lastIndexOf("\\") + 1);
		} else if (nomeImagem.lastIndexOf("/") >= -1) {
			nomeImagem = nomeImagem.substring(nomeImagem.lastIndexOf("/") + 1);
		}

		return nomeImagem;
	}        
        
         
        public void votar() {            
          /*  HtmlSelectOneRadio radio = (HtmlSelectOneRadio)event.getComponent();  
            String label = (String)radio.getValue();  
  */
            String id = (String) FacesContext.getCurrentInstance().
                            getExternalContext().getRequestParameterMap().get("id");
            
            if( nota == null){
                return;
            }
            
            System.out.println("######VOTA:" + nota);
            System.out.println("######ID:" + id);
            
            Foto foto = fotoDao.pesquisarPorId(Integer.parseInt(id));
            foto.setQuantidade(foto.getQuantidade() + 1);
            foto.setNota((foto.getNota() + nota) / 2 );
            fotoDao.atualizar(foto);
            
            nota = null;            
            
        }    
	
               // mostra todas as fotos em um DataTable
        public DataModel getAleatorio() {
            return model = new ListDataModel(fotoDao.buscaAleatorio());
        }

        public DaoGenerico<Usuario, Integer> getUsuarioDao() {
            return usuarioDao;
        }

        public void setUsuarioDao(DaoGenerico<Usuario, Integer> usuarioDao) {
            this.usuarioDao = usuarioDao;
        }

        public DaoGenerico<Veiculo, Integer> getVeiculoDao() {
            return veiculoDao;
        }

        public void setVeiculoDao(DaoGenerico<Veiculo, Integer> veiculoDao) {
            this.veiculoDao = veiculoDao;
        }

        public DaoGenerico<TipoVeiculo, Integer> getTipoVeiculoDao() {
            return tipoVeiculoDao;
        }

        public void setTipoVeiculoDao(DaoGenerico<TipoVeiculo, Integer> tipoVeiculoDao) {
            this.tipoVeiculoDao = tipoVeiculoDao;
        }
        
        public UploadedFile getFile() { return file; }
        public void setFile(UploadedFile file) { this.file = file; }
        public String getDescricao() { return descricao; }
        public void setDescricao(String descricao) { this.descricao = descricao; }        
        public void setFoto(Foto foto) { this.foto = foto; }
        public Foto getFoto() { return foto; }
        public Integer getNota() { return nota; }
        public void setNota(Integer nota) { this.nota = nota; }
        public DaoGenerico<Foto, Integer> getFotoDao() { return fotoDao; }
        public void setFotoDao(DaoGenerico<Foto, Integer> fotoDao) { this.fotoDao = fotoDao; }
        public Map<String, Object> getVeiculoItem() { return veiculoItem; }
        public void setVeiculoItem(Map<String, Object> veiculoItem) { this.veiculoItem = veiculoItem; }
        public TipoVeiculo getTipoVeiculo() { return tipoVeiculo; }
        public void setTipoVeiculo(TipoVeiculo tipoVeiculo) { this.tipoVeiculo = tipoVeiculo; }
        public Veiculo getVeiculo() { return veiculo; }
        public void setVeiculo(Veiculo veiculo) { this.veiculo = veiculo; }
        public String getCoords() { return coords; }
        public void setCoords(String coords) { this.coords = coords; }
        public Map<String, Object> getTipoVeiculoItem() { return tipoVeiculoItem; }
        public void setTipoVeiculoItem(Map<String, Object> tipoVeiculoItem) { this.tipoVeiculoItem = tipoVeiculoItem; }
}